package com.ydj.app.third.ai.deepseek;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class DeepseekChatCompletionsRes implements Serializable {

    // 这个是自己加的，用于一起返回给外部
    private Long costTime;

    /**
     * id : string
     * choices : [{"finish_reason":"stop","index":0,"message":{"content":"string","reasoning_content":"string","tool_calls":[{"id":"string","type":"function","function":{"name":"string","arguments":"string"}}],"role":"assistant"},"logprobs":{"content":[{"token":"string","logprob":0,"bytes":[0],"top_logprobs":[{"token":"string","logprob":0,"bytes":[0]}]}]}}]
     * created : 0
     * model : string
     * system_fingerprint : string
     * object : chat.completion
     * usage : {"completion_tokens":0,"prompt_tokens":0,"prompt_cache_hit_tokens":0,"prompt_cache_miss_tokens":0,"total_tokens":0,"completion_tokens_details":{"reasoning_tokens":0}}
     */

    // 该对话的唯一标识符。
    private String id;
    // 模型生成的 completion 的选择列表。
    private List<ChoicesBean> choices;
    // 创建聊天完成时的 Unix 时间戳（以秒为单位）。
    private Integer created;
    // 生成该 completion 的模型名。
    private String model;
    // This fingerprint represents the backend configuration that the model runs with.
    private String system_fingerprint;
    // 对象的类型, 其值为 chat.completion。
    private String object;
    // 该对话补全请求的用量信息。
    private UsageBean usage;

    /**
     * error : {"message":"Authentication Fails, Your api key: ****KEN> is invalid","type":"authentication_error","param":null,"code":"invalid_request_error"}
     */

    private ErrorBean error;


    @Data
    public static class UsageBean implements Serializable {
        /**
         * completion_tokens : 0
         * prompt_tokens : 0
         * prompt_cache_hit_tokens : 0
         * prompt_cache_miss_tokens : 0
         * total_tokens : 0
         * completion_tokens_details : {"reasoning_tokens":0}
         */
        // 模型 completion 产生的 token 数。
        private Integer completion_tokens;
        // 用户 prompt 所包含的 token 数。该值等于 prompt_cache_hit_tokens + prompt_cache_miss_tokens
        private Integer prompt_tokens;
        // 用户 prompt 中，命中上下文缓存的 token 数。
        private Integer prompt_cache_hit_tokens;
        // 用户 prompt 中，未命中上下文缓存的 token 数。
        private Integer prompt_cache_miss_tokens;
        // 该请求中，所有 token 的数量（prompt + completion）。
        private Integer total_tokens;
        // completion tokens 的详细信息。
        private CompletionTokensDetailsBean completion_tokens_details;

        @Data
        public static class CompletionTokensDetailsBean implements Serializable {
            /**
             * reasoning_tokens : 0
             */
            // 推理模型所产生的思维链 token 数量
            private Integer reasoning_tokens;
        }
    }

    @Data
    public static class ChoicesBean implements Serializable {
        /**
         * finish_reason : stop
         * index : 0
         * message : {"content":"string","reasoning_content":"string","tool_calls":[{"id":"string","type":"function","function":{"name":"string","arguments":"string"}}],"role":"assistant"}
         * logprobs : {"content":[{"token":"string","logprob":0,"bytes":[0],"top_logprobs":[{"token":"string","logprob":0,"bytes":[0]}]}]}
         */

        /*
        模型停止生成 token 的原因。
        stop：模型自然停止生成，或遇到 stop 序列中列出的字符串。
        length ：输出长度达到了模型上下文长度限制，或达到了 max_tokens 的限制。
        content_filter：输出内容因触发过滤策略而被过滤。
        insufficient_system_resource：系统推理资源不足，生成被打断。
         */
        private String finish_reason;
        // 该 completion 在模型生成的 completion 的选择列表中的索引。
        private Integer index;
        // 模型生成的 completion 消息。
        private MessageBean message;
        private LogprobsBean logprobs;

        @Data
        public static class MessageBean implements Serializable {
            /**
             * content : string
             * reasoning_content : string
             * tool_calls : [{"id":"string","type":"function","function":{"name":"string","arguments":"string"}}]
             * role : assistant
             */
            // 该 completion 的内容。
            private String content;
            // 仅适用于 deepseek-reasoner 模型。内容为 assistant 消息中在最终答案之前的推理内容。
            private String reasoning_content;
            // 生成这条消息的角色。
            private String role;
            // 模型生成的 tool 调用，例如 function 调用。
            private List<ToolCallsBean> tool_calls;

            @Data
            public static class ToolCallsBean implements Serializable {
                /**
                 * id : string
                 * type : function
                 * function : {"name":"string","arguments":"string"}
                 */

                private String id;
                private String type;
                private FunctionBean function;

                @Data
                public static class FunctionBean implements Serializable {
                    /**
                     * name : string
                     * arguments : string
                     */

                    private String name;
                    private String arguments;
                }
            }
        }

        @Data
        public static class LogprobsBean implements Serializable {
            private List<ContentBean> content;

            @Data
            public static class ContentBean implements Serializable {
                /**
                 * token : string
                 * logprob : 0
                 * bytes : [0]
                 * top_logprobs : [{"token":"string","logprob":0,"bytes":[0]}]
                 */

                private String token;
                private Integer logprob;
                private List<Integer> bytes;
                private List<TopLogprobsBean> top_logprobs;

                @Data
                public static class TopLogprobsBean implements Serializable {
                    /**
                     * token : string
                     * logprob : 0
                     * bytes : [0]
                     */

                    private String token;
                    private Integer logprob;
                    private List<Integer> bytes;
                }
            }
        }
    }

    @Data
    public static class ErrorBean implements Serializable {
        /**
         * message : Authentication Fails, Your api key: ****KEN> is invalid
         * type : authentication_error
         * param : null
         * code : invalid_request_error
         */

        private String message;
        private String type;
        private Object param;
        private String code;
    }
}
